package com.cskaoyan.javase.array._4operation._0traverse;

/**
 * 数组的遍历
 * 它的含义是依次访问（或输出）数组中的每一个元素。
 *
 * @since 09:23
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        int[] arr = {1, 2, 3};
        /*System.out.println(arr[0]);
        System.out.println(arr[1]);
        System.out.println(arr[2]);
        // 使用循环改进
        // 遍历数组快捷键数组名.fori
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }*/
        // 提取出方法
        // traverse(arr);
        // traverse2(arr);
        // traverse3(arr);
        // traverse4(arr);
        /*
            数组中有两个比较特殊的数组:
                1.长度为0的数组
                2.等于null的数组
            我们希望方法能够接收这两个特殊数组的输入
         */
        // arr = new int[0];
        // traverse5(arr);

        // arr = null;
        // traverse6(arr);

        arr = new int[0];
        arr = null;
        traverse7(arr);


    }

    public static void traverse(int[] arr) {
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
    }

    // 以上方法不够美观,我们希望输出的样式是: [1, 2, 3]
    public static void traverse2(int[] arr) {
        System.out.print("[");
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + ", ");
        }
        System.out.println("]");
    }

    /*
        改进格式:
            1.判断,如果是最后一个元素,就不加逗号了
            2.使用转义字符 \b
     */
    public static void traverse3(int[] arr) {
        System.out.print("[");
        for (int i = 0; i < arr.length; i++) {
            // 判断是最后一个元素
            if (i == arr.length - 1) {
                System.out.print(arr[i]);
                break;
            }
            System.out.print(arr[i] + ", ");
        }
        System.out.println("]");
    }

    public static void traverse4(int[] arr) {
        System.out.print("[");
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + ", ");
        }
        System.out.println("\b\b]");
    }

    // 改进: 使用方法能够接受长度为0的数组输入
    // 希望能够给出用户提示,不做其他输出
    public static void traverse5(int[] arr) {
        // if判断,当用户输入长度为0的数组时
        /*
            在写if判断时,if当中的语句是越长越好,还是越短越好?
            肯定是越短越好,越短代码的层级就越简单,代码的可读性就更好
            所以,我们在写if时,原则是判断写出更少语句的条件
            比如这里,就应该判断长度为0
            因为长度为0的话,一条语句就写完了
            如果判断长度不为0,就需要去遍历数组,就会很麻烦.
         */
        if (arr.length == 0) {
            System.out.println("您输入的数组长度是0,请重新输入!");
            // 不要忘记return结束方法
            return;
        }
        System.out.print("[");
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + ", ");
        }
        System.out.println("\b\b]");
    }

    // 改进: 使方法能够接受null数组的输入
    public static void traverse6(int[] arr) {
        // 先判断null,再判断长度为0
        if (arr == null) {
            System.out.println("您输入的数组是一个null,请重新输入!");
            return;
        }
        if (arr.length == 0) {
            System.out.println("您输入的数组长度是0,请重新输入!");
            // 不要忘记return结束方法
            return;
        }
        System.out.print("[");
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + ", ");
        }
        System.out.println("\b\b]");

    }

    // 改进: 同时判断数组为null和数组长度为0
    // 给出一种友好提示
    public static void traverse7(int[] arr) {
        // 固定写法
        if (arr == null || arr.length == 0) {
            System.out.println("您输入的数组不合法,请重新输入!");
            return;
        }
        System.out.print("[");
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + ", ");
        }
        System.out.println("\b\b]");

    }
}
